package com.itheima.d3_recursion;

import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Scanner;

/*
目标：递归搜索文件夹

需求：在指定目录下搜索指定包含指定名称的文件，比如在C:\\Program Files目录下搜索QQ.exe这个文件，然后直接输出。

 */
public class Demo3 {
    public static void main(String[] args) {
        //需求：键盘录入文件名name，和要查询的目录path，查询name文件的位置！
        //1. 键盘录入要查询的文件名和要查询的路径
        Scanner sc = new Scanner(System.in);
        //强制指定键盘录入默认碰到换行结束，而不是空格！
        sc.useDelimiter("\n");
        System.out.println("请输入文件名：");
        String name = sc.next();
        //System.out.println("文件名：" + name);

        System.out.println("请输入要查询的路径：");
        String path = sc.next();

        //2.定义方法实现需求

        //3.创建一个集合对象，用来存储查询到的File对象
        ArrayList<File> list = new ArrayList<>();

        //4.调用方法
        findFilesFromTarget(name, new File(path), list);

        //5.判断集合的长度
        if (list.size() == 0) {
            System.out.println("未找到指定的文件！");
        } else {
            System.out.println("查询到的文件有：");
            for (File file : list) {
                System.out.println(file);
            }
        }

        findFile(new File("E:\\ideaProject\\basic-code\\day11"));
    }

    /**
     * 方法：可以在指定路径下查询指定名称的文件
     * 明确参数：要查询的文件名，要查询的路径对应的File对象，存储目标文件对象的集合！
     * 明确返回值：有可能指定名称的文件有很多，不止一个！
     * 这里不要返回值，可以传入一个集合，在递归的过程中，不断把文件加到集合中
     */
    public static void findFilesFromTarget(String name, File target, ArrayList<File> list) {
        //3.遍历target文件夹
        File[] files = target.listFiles();

        //4.考虑：有可能target文件夹不存在！有可能target是一个文件，有可能target没有权限
        if (files != null) {
            //5.遍历files数组
            for (File file : files) {
                //6.判断file是不是文件
                if (file.isFile()) {
                    //条件成立，file是文件，就得获取它的名字，和要查询的name比较
                    String fileName = file.getName();
                    if (fileName.equals(name)) {
                        //条件成立，说明找到了，file就是要找的文件，这个文件要存入集合
                        list.add(file);
                    }
                } else {
                    //7.条件不成立，file是文件夹，这个文件夹需要把上面的逻辑再执行一遍，开始递归
                   findFilesFromTarget(name, file, list);
                }
            }
        }
    }

    public static void findFile(File file){
        File[] files = file.listFiles();
        for (File file1 : files) {
            if(file1.isFile()){
                String name = file1.getName();
                if(name.endsWith(".java")){
                    System.out.println(name);
                }
            }else {
                findFile(file1);
            }
        }
    }
}
